import os
import subprocess
import platform
import time


def run_tests():
    """运行pytest测试并生成Allure临时报告"""
    print("===== 开始执行接口自动化测试 =====")

    # 定义报告目录
    temp_report_dir = os.path.join("report", "temp")
    html_report_dir = os.path.join("report", "html")

    # 确保目录存在
    os.makedirs(temp_report_dir, exist_ok=True)
    os.makedirs(html_report_dir, exist_ok=True)

    # 构建pytest命令（指定Allure报告路径、测试标记、输出详细日志）
    pytest_cmd = [
        "pytest",
        "--alluredir", temp_report_dir,  # 生成Allure临时数据
        "-v",  # 显示详细执行过程
        "tests/"  # 测试用例目录
    ]

    try:
        # 执行pytest命令
        result = subprocess.run(
            pytest_cmd,
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True
        )
        print("测试执行完成，输出日志：")
        print(result.stdout)
        return temp_report_dir, html_report_dir

    except subprocess.CalledProcessError as e:
        print(f"测试执行失败：{e.stderr or e.stdout}")
        exit(1)


def generate_html_report(temp_dir, html_dir):
    """将Allure临时数据转换为HTML报告"""
    print("\n===== 开始生成HTML测试报告 =====")

    # 构建Allure命令（清除旧报告，生成新报告）
    allure_cmd = [
        "allure", "generate",
        temp_dir,
        "-o", html_dir,
        "--clean"  # 清除已存在的html报告
    ]

    try:
        subprocess.run(allure_cmd, shell=True, check=True, stdout=subprocess.PIPE, text=True)
        print(f"HTML报告生成成功，路径：{os.path.abspath(html_dir)}")
        return html_dir

    except subprocess.CalledProcessError as e:
        print(f"报告生成失败：{e.stderr or e.stdout}")
        exit(1)


def open_report(html_path):
    """自动打开HTML报告（适配不同操作系统）"""
    print("\n===== 尝试打开测试报告 =====")

    index_path = os.path.abspath(html_path)

    if not os.path.exists(index_path):
        print(f"报告文件不存在：{index_path}")
        return

    cmd = [
        "allure", "serve",
        "--port", "0",  # 自动选端口
        "--open",  # 自动打开浏览器
        index_path
    ]

    try:
        subprocess.run(cmd, shell=True, check=True)
        print("报告已自动打开，请查看浏览器窗口")
    except Exception as e:
        print(f"自动打开报告失败：{str(e)}")
        print(f"请手动打开报告：{os.path.abspath(index_path)}")



if __name__ == "__main__":
    # 执行流程：运行测试 -> 生成HTML报告 -> 打开报告
    temp_dir, html_dir = run_tests()
    generate_html_report(temp_dir, html_dir)
    open_report(html_dir)
    print("\n===== 流程结束 =====")